package com.cskaoyan.thread02.model.edition1;


import java.util.Random;

/*
        该类模拟生产者做包子的行为
 */
public class ProducerTask implements Runnable {

    Container container;

    // 表示包子的菜单
    Food[] foodBill = {new Food("杭州小笼包", 1), new Food("狗不理", 50),
                    new Food("蟹黄包", 10), new Food("奶黄包", 3)};


    Random random;

    public ProducerTask(Container container) {
        this.container = container;
        random = new Random();
    }

    @Override
    public void run() {

        while (true) {
            synchronized (container) {

                // 判断蒸笼是否不空，如果不空，阻止自己
                if (!container.isEmpty()) {
                    // 阻止自己
                    try {
                        // wait 方法执行，放弃锁对象, 所以如果因为wait方法而处于阻塞状态的线程
                        // 被唤醒之后，jvm是要等到该线程，重新对锁对象加锁成功，才会接着往下执行
                        container.wait();
                        //System.out.println("aaaaa");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {

                    // 如果蒸笼为空，就做包子，并通知吃包子的人来吃

                /*   该方法返回一个范围是[0, bound）一个随机整数,bound必须是一个正整数
                     random.nextInt(int bound);
                 */
                    // 随机选择一种包子
                    int randomIndex = random.nextInt(foodBill.length);
                    // 将包子放入蒸笼
                    container.setFood(foodBill[randomIndex]);

                    // 通知别人
                    // 直到当前线程放弃此对象上的锁定，才能继续执行被唤醒的线程
                    container.notify();

                }
            }
        }


    }
}
